<?php

namespace Gds\VenteBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Gds\VenteBundle\Entity\BonLivraisonClient;
use Gds\VenteBundle\Form\BonLivraisonClientType;
use Gds\VenteBundle\Entity\LigneBonLivraisonClient;
use Symfony\Component\HttpFoundation\Response;
use Gds\AchatBundle\Entity\StockAchat;
use Gds\VenteBundle\Entity\CategorieRemise;
use Gds\VenteBundle\Entity\FactureClient;
use Symfony\Component\Validator\Constraints\Date;
use Gds\VenteBundle\Entity\HistoryBonLivraisonClient;
use Gds\VenteBundle\Entity\HistoryLigneBonLivraisonClient;

class BonLivraisonController extends Controller {

    public function indexAction() {
        $em = $this->getDoctrine()->getEntityManager();
        $societe = $em->getRepository('GdsArticleBundle:Societe')->findAll()[0];
        $ref = $societe->getPrefixeBonLivraison();
        $ref_num = $societe->getNumeroBonLivraison();
        $bon_livraison = new BonLivraisonClient();
        $bon_livraison->setReference($ref . ' ' . $ref_num);
        $request = $this->getRequest();
        $form = $this->createForm(new BonLivraisonClientType, $bon_livraison);
        $user = $this->getUser();
        if ($request->isMethod('POST')) {
            try {
                $articles = json_decode($request->get('articles'));
                if (count($articles->articles) == 0) {
                    $response = new Response(json_encode(array('success' => false)));
                    $response->headers->set('Content-Type', 'application/json');
                    return $response;
                }
                $reglement = $request->get('is_reglement');
                if ($reglement == "ok")
                    $is_reglement = true;
                else
                    $is_reglement = false;
                $history_bon_livraison = new HistoryBonLivraisonClient();
                $heure = $request->get('heure');
                $form->bind($request);
                $bon_livraison = $form->getData();
                $client = $bon_livraison->getClient();
                $passager = false;
                if ($client->getRaisonSocial() == 'PASSAGER')
                    $passager = true;
                $is_facturable = $request->get('facturable');
                $nom_dep = $request->get('departement');
                $departement = $em->getRepository('GdsArticleBundle:Departement')->findOneByNom($nom_dep);
                $bon_livraison->setHeure($heure);
                $montant_bl_ttc = 0;
                $montant_noir_ttc = 0;
                foreach ($articles->articles as $json_article) {
                    $article = $em->getRepository('GdsArticleBundle:Article')->find($json_article->id);
                    $stock = $em->getRepository('GdsArticleBundle:Stock')->findOneBy(array('article' => $article, 'departement' => $departement));
                    if ($is_facturable == 'true')
                        $stock_achat = $em->getRepository('GdsAchatBundle:StockAchat')->findBy(array('stock' => $stock, 'is_noir' => 0), array('prix_achat_ttc' => 'ASC'));
                    else
                        $stock_achat = $em->getRepository('GdsAchatBundle:StockAchat')->findBy(array('stock' => $stock), array('is_noir' => 'DESC', 'prix_achat_ttc' => 'ASC'));
                    $quantite = $json_article->quantite;
                    $quantite_blanc = 0;
                    $quantite_noir = 0;
                    $prix_achat_ttc = 0;
                    $i = 0;
                    $count_stock_achat = count($stock_achat);
                    while ($quantite > 0 && $i < $count_stock_achat) {
                        if ($quantite < $stock_achat[$i]->getQuantite()) {
                            $stock_achat[$i]->setQuantite($stock_achat[$i]->getQuantite() - $quantite);
                            $prix_achat_ttc += $stock_achat[$i]->getPrixAchatTtc() * $quantite;
                            if ($stock_achat[$i]->getIsNoir())
                                $quantite_noir += $quantite;
                            else
                                $quantite_blanc += $quantite;
                            $quantite = 0;
                        } else {
                            $prix_achat_ttc += $stock_achat[$i]->getPrixAchatTtc() * $stock_achat[$i]->getQuantite();
                            if ($stock_achat[$i]->getIsNoir())
                                $quantite_noir += $stock_achat[$i]->getQuantite();
                            else
                                $quantite_blanc += $stock_achat[$i]->getQuantite();
                            $quantite -= $stock_achat[$i]->getQuantite();
                            $em->remove($stock_achat[$i]);
                        }
                        $i++;
                    }
                    if ($quantite > 0) {
                        $prix_achat_ttc += $article->getPrixAchatHt() * (1 + $article->getTauxTva() / 100) * $quantite;
                        if ($is_facturable == 'true')
                            $quantite_blanc += $quantite;
                        else {
                            $q_n = $stock->getQuantiteNoir() - $quantite_noir;
                            $q_b = $stock->getQuantiteBlanc() - $quantite_blanc;
                            if ($quantite <= $q_n || $q_b <= 0) {
                                $quantite_noir += $quantite;
                            } else {
                                if ($q_n > 0) {
                                    $quantite_noir += $q_n;
                                    $quantite -=$q_n;
                                }
                                if ($q_b >= $quantite) {
                                    $quantite_blanc +=$quantite;
                                } else {
                                    $quantite_blanc +=$q_b;
                                    $quantite_noir = $quantite_noir + $quantite - $q_b;
                                }
                            }
                        }
                    }
                    $stock->setQuantiteBlanc($stock->getQuantiteBlanc() - $quantite_blanc);
                    $stock->setQuantiteNoir($stock->getQuantiteNoir() - $quantite_noir);
                    $prix_achat_ttc /= $json_article->quantite;
                    $prix_vente = $json_article->prix_vente;
                    $taux_tva = $json_article->taux_tva;
                    $remise = $json_article->remise;
                    $prix_vente_ttc = $prix_vente * (1 + $taux_tva / 100) * (1 - $remise / 100);
                    $prix_vente_ttc = round($prix_vente_ttc, 3);
                    $montant_bl_ttc += $prix_vente_ttc * $quantite_blanc;
                    $montant_noir_ttc += $prix_vente_ttc * $quantite_noir;
                    $ligne = new LigneBonLivraisonClient();
                    $ligne->setArticle($article);
                    $ligne->setQuantiteBlanc($quantite_blanc);
                    $ligne->setQuantiteNoir($quantite_noir);
                    $ligne->setPrixUnitaireHt($prix_vente);
                    $ligne->setPrixAchatTtc($prix_achat_ttc);
                    $ligne->setTauxRemise($remise);
                    $ligne->setTauxTva($taux_tva);
                    $bon_livraison->addLignesBonLivraison($ligne);
                    $history_ligne = new HistoryLigneBonLivraisonClient();
                    $history_ligne->setArticle($article);
                    $history_ligne->setQuantiteBlanc($quantite_blanc);
                    $history_ligne->setQuantiteNoir($quantite_noir);
                    $history_ligne->setPrixUnitaireHt($prix_vente);
                    $history_ligne->setPrixAchatTtc($prix_achat_ttc);
                    $history_ligne->setTauxRemise($remise);
                    $history_ligne->setTauxTva($taux_tva);
                    $history_bon_livraison->addHistoryLignesBonLivraison($history_ligne);
                    if (!$passager) {
                        $categorie_remise = $em->getRepository('GdsVenteBundle:CategorieRemise')->findOneBy(array('client' => $client, 'article' => $article));
                        if ($categorie_remise != null)
                            $categorie_remise->setRemise($remise);
                        else {
                            $categorie_remise = new CategorieRemise();
                            $categorie_remise->setArticle($article);
                            $categorie_remise->setClient($client);
                            $categorie_remise->setRemise($remise);
                            $em->persist($categorie_remise);
                        }
                    }
                }
                $ref_num = $societe->getNumeroBonLivraison();
                $societe->setNumeroBonLivraison($ref_num + 1);
                $bon_livraison->setReference($ref . ' ' . $ref_num);
                $bon_livraison->setDepartement($departement);
                $bon_livraison->setReste($montant_bl_ttc + $montant_noir_ttc);
                $bon_livraison->setMontantBlancTtc($montant_bl_ttc);
                $bon_livraison->setMontantNoirTtc($montant_noir_ttc);
                $bon_livraison->setUser($user);
                $solde_client = $client->getSolde();
                $limite_credit = $client->getLimiteCredit();
                if ($solde_client + $montant_bl_ttc + $montant_noir_ttc > $limite_credit) {
                    $mdp = $request->get('mdp');
                    $code_secret = $societe->getCodeSecret();
                    if ($mdp != $code_secret) {
                        $response = new Response(json_encode(array('limit_depass' => true)));
                        $response->headers->set('Content-Type', 'application/json');
                        return $response;
                    }
                }
                $client->setSolde($solde_client + $montant_bl_ttc + $montant_noir_ttc);
                $history_bon_livraison->setReference($ref . ' ' . $ref_num);
                $history_bon_livraison->setDepartement($departement);
                $history_bon_livraison->setReste($montant_bl_ttc + $montant_noir_ttc);
                $history_bon_livraison->setMontantBlancTtc($montant_bl_ttc);
                $history_bon_livraison->setMontantNoirTtc($montant_noir_ttc);
                $history_bon_livraison->setUser($user);
                $history_bon_livraison->setDate($bon_livraison->getDate());
                $history_bon_livraison->setHeure($bon_livraison->getHeure());
                $history_bon_livraison->setClient($bon_livraison->getClient());
                $em->persist($bon_livraison);
                $em->persist($history_bon_livraison);
                $em->flush();
                $response = new Response(json_encode(array('success' => true, 'id' => $bon_livraison->getId())));
                $response->headers->set('Content-Type', 'application/json');
                return $response;
            } catch (Exception $e) {
                $response = new Response(json_encode(array('success' => false)));
                $response->headers->set('Content-Type', 'application/json');
                return $response;
            }
        }
        return $this->render('GdsVenteBundle:BonLivraison:bon_livraison.html.twig', array('form' => $form->createView(), 'user' => $user));
    }

//    public function recetteJour() {
//
//        $facade = $this->get('ps_pdf.facade');
//        $response = new Response();
//        $montants = [];
//        $jour = 1;
//        $numero = 1661;
//        foreach ($montants as $montant) {
//            if ($jour < 10)
//                $date = "0" . $jour . "/12/2013";
//            else
//                $date = $jour . "/12/2013";
//            $tva = round($montant * 0.18, 3);
//            $timbre = 0.400;
//            $ttc = $montant + $tva + $timbre;
//            $montant_lettre = $this->chiffre_to_lettre($ttc);
//            $this->render('GdsVenteBundle:BonLivraison:recette.pdf.twig', array('numero' => $numero, 'date' => $date, 'montant' => $montant, 'tva' => $tva, 'lettre' => $montant_lettre), $response);
//            $xml = $response->getContent();
//            $content = $facade->render($xml);
//            file_put_contents("uploads/Facture/Facture $numero.pdf", $content);
//            $numero++;
//            $jour++;
//        }
//        return new Response(json_encode(array('success' => true)));
//    }


    public function printBonLivraisonSavedAction() {
        $em = $this->getDoctrine()->getEntityManager();
        $request = $this->getRequest();
        $societe = $em->getRepository('GdsArticleBundle:Societe')->findAll()[0];
        $prefixe_bl = $societe->getPrefixeBonLivraison();
        $id = $request->get('id');
        $bon_livraison = $em->getRepository('GdsVenteBundle:BonLivraisonClient')->find($id);
        $reference = $bon_livraison->getReference();
        $numero = str_replace($prefixe_bl, '', $reference);
        $lignes = $em->getRepository('GdsVenteBundle:LigneBonLivraisonClient')->findBy(array('bon_livraison' => $bon_livraison));
        $facade = $this->get('ps_pdf.facade');
        $response = new Response();
        $total_brut = 0;
        $remise = 0;
        $total_tva = 0;
        foreach ($lignes as $ligne) {
            $prix = $ligne->getQuantite() * $ligne->getPrixUnitaireHt();
            $total_brut += $prix;
            $remise += $prix * $ligne->getTauxRemise() / 100;
            $total_tva += $prix * (1 - $ligne->getTauxRemise() / 100) * $ligne->getTauxTva() / 100;
        }
        $total_ht = $total_brut - $remise;
        $total_ttc = $total_ht + $total_tva;
        $total_ttc = round($total_ttc, 3);
        $montant_lettre = $this->chiffre_to_lettre($total_ttc);
        $this->render('GdsVenteBundle:BonLivraison:bon_livraison_saved.pdf.twig', array('lignes' => $lignes, 'numero' => $numero, 'total_ttc' => $total_ttc, 'total_brut' => $total_brut, 'remise' => $remise, 'total_ht' => $total_ht, 'total_tva' => $total_tva, 'montant_lettre' => $montant_lettre, 'bon_livraison' => $bon_livraison), $response);
        $xml = $response->getContent();
        $content = $facade->render($xml);
        file_put_contents('uploads/bon_livraison_saved.pdf', $content);
        exec("printbonlivraisonsaved.vbs");
        return new Response(json_encode(array('success' => true)));
    }

    public function getAllBonLivraisonAction() {
        $em = $this->getDoctrine()->getEntityManager();
        $request = $this->getRequest();
        $num = $request->get('numero');
        $client = $request->get('client');
        $date1 = $request->get('date1');
        $date2 = $request->get('date2');
        $heure1 = $request->get('heure1');
        $heure2 = $request->get('heure2');
        $ref = $request->get('reference');
        $des = $request->get('designation');
        $ttc1 = $request->get('ttc1');
        $ttc2 = $request->get('ttc2');
        $is_facturer = $request->get('is_facturer');
        $reglement = $request->get('reglement');
        $departement = $request->get('departement');
        $user = $this->getUser();
        if (!$request->get('type') && !$request->get('retour'))
            $departement = $user->getDepartement()->getId();
        if ($is_facturer == 2)
            $is_facturer = '';
        $query = $em->getRepository('GdsVenteBundle:BonLivraisonClient')->getResult($num, $client, $date1, $date2, $heure1, $heure2, $ref, $des, $ttc1, $ttc2, $is_facturer, $reglement, $departement);
        $paginator = $this->get('knp_paginator');
        $pagination = $paginator->paginate(
                $query, $request->get('page', 1)/* page number */, 10/* limit per page */
        );
        $bons = $em->getRepository('GdsVenteBundle:BonLivraisonClient')->findBy(array('client' => $client, 'facture' => null));
        if ($request->get('type')) {
            return $this->render('GdsVenteBundle:BonLivraison:page_liste_bon_livraison.html.twig', array('pagination' => $pagination, 'departement' => $departement, 'bons' => $bons));
        }
        if ($request->get('retour') != "")
            return $this->render('GdsVenteBundle:BonLivraison:liste_bon_livraison.html.twig', array('pagination' => $pagination, 'departement' => $departement, 'bons' => $bons));
        return $this->render('GdsVenteBundle:BonLivraison:all_bon_livraison.html.twig', array('pagination' => $pagination, 'departement' => $user->getDepartement()->getId(), 'bons' => null));
    }

    public function showAction() {
        $em = $this->getDoctrine()->getEntityManager();
        $request = $this->getRequest();
        $id = $request->get('id');
        $bon_livraison = $em->getRepository('GdsVenteBundle:BonLivraisonClient')->find($id);
        $lignes_bon_livraison = $em->getRepository('GdsVenteBundle:LigneBonLivraisonClient')->findBy(array('bon_livraison' => $bon_livraison));
        $lignes = $em->getRepository('GdsVenteBundle:LigneBonLivraisonClient')->findBy(array('bon_livraison' => $bon_livraison), array('taux_tva' => 'ASC'));
        $taxes = array();
        foreach ($lignes as $ligne) {
            $tva = $ligne->getTauxTva();
            $base = $ligne->getQuantite() * $ligne->getPrixUnitaireHt() * (1 - $ligne->getTauxRemise() / 100);
            $montant = $base * $tva / 100;
            $exist = false;
            foreach ($taxes as $k => $taxe) {
                if (!$exist && $taxe['tva'] == $tva) {
                    $taxes[$k]['base']+=$base;
                    $taxes[$k]['montant']+=$montant;
                    $exist = true;
                }
            }
            if (!$exist) {
                $taxe = array();
                $taxe['tva'] = $tva;
                $taxe['base'] = $base;
                $taxe['montant'] = $montant;
                $taxes[count($taxes)] = $taxe;
            }
        }
        return $this->render('GdsVenteBundle:BonLivraison:bon_livraison_show.html.twig', array('bon_livraison' => $bon_livraison, 'lignes' => $lignes_bon_livraison, 'taxes' => $taxes, 'id' => $id));
    }

    public function editAction() {
        $request = $this->getRequest();
        $id = $request->get('id');
        $em = $this->getDoctrine()->getEntityManager();
        $bon_livraison = $em->getRepository('GdsVenteBundle:BonLivraisonClient')->find($id);
        $form = $this->createForm(new BonLivraisonClientType, $bon_livraison);
        $user = $this->getUser();
        if ($request->isMethod('POST')) {
            $articles = json_decode($request->get('articles'));
            if (count($articles->articles) == 0) {
                $response = new Response(json_encode(array('success' => false)));
                $response->headers->set('Content-Type', 'application/json');
                return $response;
            }
            $old_client = $bon_livraison->getClient();
            $montant_old_bl = $bon_livraison->getMontantTtc();
            $montant_paye = $montant_old_bl - $bon_livraison->getReste();
            $societe = $em->getRepository('GdsArticleBundle:Societe')->findAll()[0];
            $prefixe_bl = $societe->getPrefixeBonLivraison();
            $reference = $bon_livraison->getReference();
            $numero = str_replace($prefixe_bl, '', $reference);
            $history_bon_livraison = new HistoryBonLivraisonClient();
            $departement = $bon_livraison->getDepartement();
            foreach ($bon_livraison->getLignesBonLivraison() as $ligne) {
                $article = $ligne->getArticle();
                $quantite_blanc = $ligne->getQuantiteBlanc();
                $quantite_noir = $ligne->getQuantiteNoir();
                $prix_achat_ttc = $ligne->getPrixAchatTtc();
                $stock = $em->getRepository('GdsArticleBundle:Stock')->findOneBy(array('departement' => $departement, 'article' => $article));
                $quantite_stock_blanc = $stock->getQuantiteBlanc();
                $quantite_stock_noir = $stock->getQuantiteNoir();
                $stock->setQuantiteBlanc($quantite_stock_blanc + $quantite_blanc);
                $stock->setQuantiteNoir($quantite_stock_noir + $quantite_noir);
                if ($quantite_blanc != 0) {
                    $stock_achat = $em->getRepository('GdsAchatBundle:StockAchat')->findOneBy(array('stock' => $stock, 'prix_achat_ttc' => $prix_achat_ttc, 'is_noir' => 0));
                    if ($stock_achat != null) {
                        if ($quantite_stock_blanc >= 0) {
                            $stock_achat->setQuantite($stock_achat->getQuantite() + $quantite_blanc);
                        } else {
                            $stock_achat->setQuantite($stock_achat->getQuantite() + $quantite_blanc + $quantite_stock_blanc);
                        }
                    } else {
                        $stock_achat = new StockAchat();
                        $stock_achat->setIsNoir(0);
                        $stock_achat->setPrixAchatTtc($prix_achat_ttc);
                        $stock_achat->setStock($stock);
                        if ($quantite_stock_blanc >= 0) {
                            $stock_achat->setQuantite($quantite_blanc);
                        } else {
                            $stock_achat->setQuantite($quantite_blanc + $quantite_stock_blanc);
                        }
                        $em->persist($stock_achat);
                    }
                }
                if ($quantite_noir != 0) {
                    $stock_achat = $em->getRepository('GdsAchatBundle:StockAchat')->findOneBy(array('stock' => $stock, 'prix_achat_ttc' => $prix_achat_ttc, 'is_noir' => 1));
                    if ($stock_achat != null) {
                        if ($quantite_stock_noir >= 0) {
                            $stock_achat->setQuantite($stock_achat->getQuantite() + $quantite_noir);
                        } else {
                            $stock_achat->setQuantite($stock_achat->getQuantite() + $quantite_noir + $quantite_stock_noir);
                        }
                    } else {
                        $stock_achat = new StockAchat();
                        $stock_achat->setIsNoir(1);
                        $stock_achat->setPrixAchatTtc($prix_achat_ttc);
                        $stock_achat->setStock($stock);
                        if ($quantite_stock_noir >= 0) {
                            $stock_achat->setQuantite($quantite_noir);
                        } else {
                            $stock_achat->setQuantite($quantite_noir + $quantite_stock_noir);
                        }
                        $em->persist($stock_achat);
                    }
                }
                $em->remove($ligne);
            }
            $heure = $request->get('heure');
            $form->bind($request);
            $bon_livraison = $form->getData();
            $client = $bon_livraison->getClient();
            $is_facturable = $request->get('facturable');
            $bon_livraison->setHeure($heure);
            $montant_bl_ttc = 0;
            $montant_noir_ttc = 0;
            foreach ($articles->articles as $json_article) {
                $article = $em->getRepository('GdsArticleBundle:Article')->find($json_article->id);
                $stock = $em->getRepository('GdsArticleBundle:Stock')->findOneBy(array('article' => $article, 'departement' => $departement));
                if ($is_facturable == 'true')
                    $stock_achat = $em->getRepository('GdsAchatBundle:StockAchat')->findBy(array('stock' => $stock, 'is_noir' => 0), array('prix_achat_ttc' => 'ASC'));
                else
                    $stock_achat = $em->getRepository('GdsAchatBundle:StockAchat')->findBy(array('stock' => $stock), array('is_noir' => 'DESC', 'prix_achat_ttc' => 'ASC'));
                $quantite = $json_article->quantite;
                $quantite_blanc = 0;
                $quantite_noir = 0;
                $prix_achat_ttc = 0;
                $i = 0;
                $count_stock_achat = count($stock_achat);
                while ($quantite > 0 && $i < $count_stock_achat) {
                    if ($quantite <= $stock_achat[$i]->getQuantite()) {
                        $stock_achat[$i]->setQuantite($stock_achat[$i]->getQuantite() - $quantite);
                        $prix_achat_ttc += $stock_achat[$i]->getPrixAchatTtc() * $quantite;
                        if ($stock_achat[$i]->getIsNoir())
                            $quantite_noir += $quantite;
                        else
                            $quantite_blanc += $quantite;
                        $quantite = 0;
                    } else {
                        $prix_achat_ttc += $stock_achat[$i]->getPrixAchatTtc() * $stock_achat[$i]->getQuantite();
                        if ($stock_achat[$i]->getIsNoir())
                            $quantite_noir += $stock_achat[$i]->getQuantite();
                        else
                            $quantite_blanc += $stock_achat[$i]->getQuantite();
                        $quantite -= $stock_achat[$i]->getQuantite();
                        $stock_achat[$i]->setQuantite(0);
                        $em->remove($stock_achat[$i]);
                    }
                    $i++;
                }
                if ($quantite > 0) {
                    $prix_achat_ttc += $article->getPrixAchatHt() * (1 + $article->getTauxTva() / 100) * $quantite;
                    if ($is_facturable == 'true')
                        $quantite_blanc += $quantite;
                    else {
                        $q_n = $stock->getQuantiteNoir() - $quantite_noir;
                        $q_b = $stock->getQuantiteBlanc() - $quantite_blanc;
                        if ($quantite <= $q_n || $q_b <= 0) {
                            $quantite_noir += $quantite;
                        } else {
                            if ($q_n > 0) {
                                $quantite_noir += $q_n;
                                $quantite -=$q_n;
                            }
                            if ($q_b >= $quantite) {
                                $quantite_blanc +=$quantite;
                            } else {
                                $quantite_blanc +=$q_b;
                                $quantite_noir = $quantite_noir + $quantite - $q_b;
                            }
                        }
                    }
                }
                $stock->setQuantiteBlanc($stock->getQuantiteBlanc() - $quantite_blanc);
                $stock->setQuantiteNoir($stock->getQuantiteNoir() - $quantite_noir);
                $prix_achat_ttc /= $json_article->quantite;
                $prix_vente = $json_article->prix_vente;
                $taux_tva = $json_article->taux_tva;
                $remise = $json_article->remise;
                $prix_vente_ttc = $prix_vente * (1 + $taux_tva / 100) * (1 - $remise / 100);
                $prix_vente_ttc = round($prix_vente_ttc, 3);
                $montant_bl_ttc += $prix_vente_ttc * $quantite_blanc;
                $montant_noir_ttc += $prix_vente_ttc * $quantite_noir;
                $ligne = new LigneBonLivraisonClient();
                $ligne->setArticle($article);
                $ligne->setQuantiteBlanc($quantite_blanc);
                $ligne->setQuantiteNoir($quantite_noir);
                $ligne->setPrixUnitaireHt($prix_vente);
                $ligne->setPrixAchatTtc($prix_achat_ttc);
                $ligne->setTauxRemise($remise);
                $ligne->setTauxTva($taux_tva);
                $bon_livraison->addLignesBonLivraison($ligne);

                $history_ligne = new HistoryLigneBonLivraisonClient();
                $history_ligne->setArticle($article);
                $history_ligne->setQuantiteBlanc($quantite_blanc);
                $history_ligne->setQuantiteNoir($quantite_noir);
                $history_ligne->setPrixUnitaireHt($prix_vente);
                $history_ligne->setPrixAchatTtc($prix_achat_ttc);
                $history_ligne->setTauxRemise($remise);
                $history_ligne->setTauxTva($taux_tva);
                $history_bon_livraison->addHistoryLignesBonLivraison($history_ligne);
                if ($client->getRaisonSocial() != 'PASSAGER') {
                    $categorie_remise = $em->getRepository('GdsVenteBundle:CategorieRemise')->findOneBy(array('client' => $client, 'article' => $article));
                    if ($categorie_remise != null)
                        $categorie_remise->setRemise($remise);
                    else {
                        $categorie_remise = new CategorieRemise();
                        $categorie_remise->setArticle($article);
                        $categorie_remise->setClient($client);
                        $categorie_remise->setRemise($remise);
                        $em->persist($categorie_remise);
                    }
                }
            }
            $bon_livraison->setDepartement($departement);
            $bon_livraison->setReste($montant_bl_ttc + $montant_noir_ttc - $montant_paye);
            $bon_livraison->setMontantBlancTtc($montant_bl_ttc);
            $bon_livraison->setMontantNoirTtc($montant_noir_ttc);
            $bon_livraison->setUser($user);
            if ($client != $old_client)
                $old_client->setSolde($old_client->getSolde() - $montant_old_bl);
            else
                $client->setSolde($client->getSolde() - $montant_old_bl);
            $solde_client = $client->getSolde();
            $limite_credit = $client->getLimiteCredit();
            if ($solde_client + $montant_bl_ttc + $montant_noir_ttc > $limite_credit) {
                $mdp = $request->get('mdp');
                $societe = $em->getRepository('GdsArticleBundle:Societe')->findAll()[0];
                $code_secret = $societe->getCodeSecret();
                if ($mdp != $code_secret) {
                    $response = new Response(json_encode(array('limit_depass' => true)));
                    $response->headers->set('Content-Type', 'application/json');
                    return $response;
                }
            }
            $client->setSolde($solde_client + $montant_bl_ttc + $montant_noir_ttc);
            $history_bon_livraison->setReference($bon_livraison->getReference());
            $history_bon_livraison->setDepartement($departement);
            $history_bon_livraison->setReste($montant_bl_ttc + $montant_noir_ttc - $montant_paye);
            $history_bon_livraison->setMontantBlancTtc($montant_bl_ttc);
            $history_bon_livraison->setMontantNoirTtc($montant_noir_ttc);
            $history_bon_livraison->setUser($user);
            $history_bon_livraison->setDate($this->DateTimeNow()[0]);
            $history_bon_livraison->setHeure($this->DateTimeNow()[1]);
            $history_bon_livraison->setClient($bon_livraison->getClient());
            $em->persist($bon_livraison);
            $em->persist($history_bon_livraison);
            $em->flush();
            $response = new Response(json_encode(array('success' => true, 'id' => $bon_livraison->getId())));
            $response->headers->set('Content-Type', 'application/json');
            return $response;
        }
        $time = $bon_livraison->getTime();
        $heure = $bon_livraison->getHeure();
        $lignes = array();
        foreach ($bon_livraison->getLignesBonLivraison() as $k => $ligne) {
            $lignes[$k] = $ligne;
        }
        return $this->render('GdsVenteBundle:BonLivraison:bon_livraison_edit.html.twig', array('form' => $form->createView(), 'heure' => $heure, 'time' => $time, 'lignes' => $lignes, 'id' => $id, 'user' => $user, 'bon_livraison' => $bon_livraison));
    }

    public function duppliquerAction() {
        $request = $this->getRequest();
        $id = $request->get('id');
        $em = $this->getDoctrine()->getEntityManager();
        $old_bon_livraison = $em->getRepository('GdsVenteBundle:BonLivraisonClient')->find($id);
        $bon_livraison = clone $old_bon_livraison;
        $societe = $em->getRepository('GdsArticleBundle:Societe')->findAll()[0];
        $pref = $societe->getPrefixeBonLivraison();
        $num = $societe->getNumeroBonLivraison();
        $bon_livraison->setReference($pref . ' ' . $num);
        $form = $this->createForm(new BonLivraisonClientType, $bon_livraison);
        $user = $this->getUser();
        if ($request->isMethod('POST')) {
            try {
                $articles = json_decode($request->get('articles'));
                if (count($articles->articles) == 0) {
                    $response = new Response(json_encode(array('success' => false)));
                    $response->headers->set('Content-Type', 'application/json');
                    return $response;
                }
                $history_bon_livraison = new HistoryBonLivraisonClient();
                $heure = $request->get('heure');
                $form->bind($request);
                $bon_livraison = $form->getData();
                $client = $bon_livraison->getClient();
                $passager = false;
                if ($client->getRaisonSocial() == 'PASSAGER')
                    $passager = true;
                $is_facturable = $request->get('facturable');
                $nom_dep = $request->get('departement');
                $bon_livraison->setHeure($heure);
                $montant_bl_ttc = 0;
                $montant_noir_ttc = 0;
                $departement = $em->getRepository('GdsArticleBundle:Departement')->findOneByNom($nom_dep);
                foreach ($articles->articles as $json_article) {
                    $article = $em->getRepository('GdsArticleBundle:Article')->find($json_article->id);
                    $stock = $em->getRepository('GdsArticleBundle:Stock')->findOneBy(array('article' => $article, 'departement' => $departement));
                    if ($is_facturable == 'true')
                        $stock_achat = $em->getRepository('GdsAchatBundle:StockAchat')->findBy(array('stock' => $stock, 'is_noir' => 0), array('prix_achat_ttc' => 'ASC'));
                    else
                        $stock_achat = $em->getRepository('GdsAchatBundle:StockAchat')->findBy(array('stock' => $stock), array('is_noir' => 'DESC', 'prix_achat_ttc' => 'ASC'));
                    $quantite = $json_article->quantite;
                    $quantite_blanc = 0;
                    $quantite_noir = 0;
                    $prix_achat_ttc = 0;
                    $i = 0;
                    $count_stock_achat = count($stock_achat);
                    while ($quantite > 0 && $i < $count_stock_achat) {
                        if ($quantite <= $stock_achat[$i]->getQuantite()) {
                            $stock_achat[$i]->setQuantite($stock_achat[$i]->getQuantite() - $quantite);
                            $prix_achat_ttc += $stock_achat[$i]->getPrixAchatTtc() * $quantite;
                            if ($stock_achat[$i]->getIsNoir())
                                $quantite_noir += $quantite;
                            else
                                $quantite_blanc += $quantite;
                            $quantite = 0;
                        } else {
                            $prix_achat_ttc += $stock_achat[$i]->getPrixAchatTtc() * $stock_achat[$i]->getQuantite();
                            if ($stock_achat[$i]->getIsNoir())
                                $quantite_noir += $stock_achat[$i]->getQuantite();
                            else
                                $quantite_blanc += $stock_achat[$i]->getQuantite();
                            $quantite -= $stock_achat[$i]->getQuantite();
                            $stock_achat[$i]->setQuantite(0);
                            $em->remove($stock_achat[$i]);
                        }
                        $i++;
                    }
                    if ($quantite > 0) {
                        $prix_achat_ttc += $article->getPrixAchatHt() * (1 + $article->getTauxTva() / 100) * $quantite;
                        if ($is_facturable == 'true')
                            $quantite_blanc += $quantite;
                        else {
                            $q_n = $stock->getQuantiteNoir() - $quantite_noir;
                            $q_b = $stock->getQuantiteBlanc() - $quantite_blanc;
                            if ($quantite <= $q_n || $q_b <= 0) {
                                $quantite_noir += $quantite;
                            } else {
                                if ($q_n > 0) {
                                    $quantite_noir += $q_n;
                                    $quantite -=$q_n;
                                }
                                if ($q_b >= $quantite) {
                                    $quantite_blanc +=$quantite;
                                } else {
                                    $quantite_blanc +=$q_b;
                                    $quantite_noir = $quantite_noir + $quantite - $q_b;
                                }
                            }
                        }
                    }
                    $stock->setQuantiteBlanc($stock->getQuantiteBlanc() - $quantite_blanc);
                    $stock->setQuantiteNoir($stock->getQuantiteNoir() - $quantite_noir);
                    $prix_achat_ttc /= $json_article->quantite;
                    $prix_vente = $json_article->prix_vente;
                    $taux_tva = $json_article->taux_tva;
                    $remise = $json_article->remise;
                    $prix_vente_ttc = $prix_vente * (1 + $taux_tva / 100) * (1 - $remise / 100);
                    $prix_vente_ttc = round($prix_vente_ttc, 3);
                    $montant_bl_ttc += $prix_vente_ttc * $quantite_blanc;
                    $montant_noir_ttc += $prix_vente_ttc * $quantite_noir;
                    $ligne = new LigneBonLivraisonClient();
                    $ligne->setArticle($article);
                    $ligne->setQuantiteBlanc($quantite_blanc);
                    $ligne->setQuantiteNoir($quantite_noir);
                    $ligne->setPrixUnitaireHt($prix_vente);
                    $ligne->setPrixAchatTtc($prix_achat_ttc);
                    $ligne->setTauxRemise($remise);
                    $ligne->setTauxTva($taux_tva);
                    $bon_livraison->addLignesBonLivraison($ligne);

                    $history_ligne = new HistoryLigneBonLivraisonClient($ligne);
                    $history_ligne->setArticle($article);
                    $history_ligne->setQuantiteBlanc($quantite_blanc);
                    $history_ligne->setQuantiteNoir($quantite_noir);
                    $history_ligne->setQuantiteRetour(0);
                    $history_ligne->setPrixUnitaireHt($prix_vente);
                    $history_ligne->setPrixAchatTtc($prix_achat_ttc);
                    $history_ligne->setTauxRemise($remise);
                    $history_ligne->setTauxTva($taux_tva);
                    $history_bon_livraison->addHistoryLignesBonLivraison($history_ligne);
                    if (!$passager) {
                        $categorie_remise = $em->getRepository('GdsVenteBundle:CategorieRemise')->findOneBy(array('client' => $client, 'article' => $article));
                        if ($categorie_remise != null)
                            $categorie_remise->setRemise($remise);
                        else {
                            $categorie_remise = new CategorieRemise();
                            $categorie_remise->setArticle($article);
                            $categorie_remise->setClient($client);
                            $categorie_remise->setRemise($remise);
                            $em->persist($categorie_remise);
                        }
                    }
                }
                $ref_num = $societe->getNumeroBonLivraison();
                $societe->setNumeroBonLivraison($ref_num + 1);
                $bon_livraison->setReference($pref . ' ' . $ref_num);
                $bon_livraison->setDepartement($departement);
                $bon_livraison->setReste($montant_bl_ttc + $montant_noir_ttc);
                $bon_livraison->setMontantBlancTtc($montant_bl_ttc);
                $bon_livraison->setMontantNoirTtc($montant_noir_ttc);
                $bon_livraison->setUser($user);
                $bon_livraison->setFacture(null);
                $solde_client = $client->getSolde();
                $limite_credit = $client->getLimiteCredit();
                if ($solde_client + $montant_bl_ttc + $montant_noir_ttc > $limite_credit) {
                    $mdp = $request->get('mdp');
                    $code_secret = $societe->getCodeSecret();
                    if ($mdp != $code_secret) {
                        $response = new Response(json_encode(array('limit_depass' => true)));
                        $response->headers->set('Content-Type', 'application/json');
                        return $response;
                    }
                }
                $client->setSolde($solde_client + $montant_bl_ttc + $montant_noir_ttc);
                $history_bon_livraison->setReference($pref . ' ' . $ref_num);
                $history_bon_livraison->setDepartement($departement);
                $history_bon_livraison->setReste($montant_bl_ttc + $montant_noir_ttc);
                $history_bon_livraison->setMontantBlancTtc($montant_bl_ttc);
                $history_bon_livraison->setMontantNoirTtc($montant_noir_ttc);
                $history_bon_livraison->setUser($user);
                $history_bon_livraison->setDate($bon_livraison->getDate());
                $history_bon_livraison->setHeure($bon_livraison->getHeure());
                $history_bon_livraison->setClient($bon_livraison->getClient());
                $em->persist($bon_livraison);
                $em->persist($history_bon_livraison);
                $em->flush();
                $response = new Response(json_encode(array('success' => true, 'numero' => $ref_num)));
                $response->headers->set('Content-Type', 'application/json');
                return $response;
            } catch (Exception $e) {
                $response = new Response(json_encode(array('success' => false)));
                $response->headers->set('Content-Type', 'application/json');
                return $response;
            }
        }
        $time = $bon_livraison->getTime();
        $heure = $bon_livraison->getHeure();
        $lignes = array();
        foreach ($bon_livraison->getLignesBonLivraison() as $k => $ligne) {
            $lignes[$k] = $ligne;
        }
        return $this->render('GdsVenteBundle:BonLivraison:bon_livraison_duppliquer.html.twig', array('form' => $form->createView(), 'heure' => $heure, 'time' => $time, 'lignes' => $lignes, 'id' => $id, 'user' => $user));
    }

    public function deleteAction() {
        $request = $this->getRequest();
        $id = $request->get('id');
        $em = $this->getDoctrine()->getEntityManager();
        $bon_livraison = $em->getRepository('GdsVenteBundle:BonLivraisonClient')->find($id);
        $bon_livraison->setIsSupprimer(true);
        $client = $bon_livraison->getClient();
        $montant_ttc = $bon_livraison->getMontantTtc();
        if ($montant_ttc == $bon_livraison->getReste()) {
            $client->setSolde($client->getSolde() - $montant_ttc);
        } elseif ($bon_livraison->getReste() != 0) {
            return new Response('failed');
        }
        $em->flush();
        return new Response('success');
    }

    public function facturerAction() {
        $em = $this->getDoctrine()->getEntityManager();
        $request = $this->getRequest();
        $id = $request->get('id');
        $societe = $em->getRepository('GdsArticleBundle:Societe')->findAll()[0];
        $reference_facture = $societe->getPrefixeFacture() . ' ' . $societe->getNumeroFacture();
        $timbre = $societe->getTimbreFiscal();
        $user = $this->getUser();
        $bon_livraison = $em->getRepository('GdsVenteBundle:BonLivraisonClient')->find($id);
        if ($request->isMethod('POST')) {
            try {
                $date = $request->get('date');
                $heure = $request->get('heure');
                $all_articles = json_decode($request->get('all_articles'));
                $ancien_montant_ttc = $bon_livraison->getMontantTtc();
                $client = $bon_livraison->getClient();
                if ($this->hasBlack($em, $bon_livraison)) {
                    $departement = $bon_livraison->getDepartement();
                    $lignes = $this->fusionner_json($all_articles);
                    foreach ($lignes as $ligne_article) {
                        $article = $em->getRepository('GdsArticleBundle:Article')->find($ligne_article['id']);
                        $stock = $em->getRepository('GdsArticleBundle:Stock')->findOneBy(array('article' => $article, 'departement' => $departement));
                        $ligne_bl = $em->getRepository('GdsVenteBundle:LigneBonLivraisonClient')->findOneBy(array('bon_livraison' => $bon_livraison, 'article' => $article));
                        if (!$ligne_article['replaced']) {
                            if ($ligne_article['changed']) {
                                $ligne_bl->setQuantiteBlanc($ligne_article['quantite_blanc']);
                                $ligne_bl->setQuantiteNoir(0);
                                $difference = $ligne_article['quantite_blanc'] - $ligne_article['quantite_blanc_begin'];
                                $stock->setQuantiteBlanc($stock->getQuantiteBlanc() - $difference);
                                $stock->setQuantiteNoir($stock->getQuantiteNoir() + $difference);
                                do {
                                    $stock_achat = $em->getRepository('GdsAchatBundle:StockAchat')->findBy(array('stock' => $stock, 'is_noir' => 0), array('prix_achat_ttc' => 'ASC'));
                                    if ($stock_achat != null && $stock_achat->getQuantite() <= $difference) {
                                        $stock_achat->setIsNoir(true);
                                        $difference -= $stock_achat->getQuantite();
                                    } else {
                                        if ($stock_achat != null)
                                            $stock_achat->setQuantite($stock_achat->getQuantite() - $difference);
                                        $stock_achat2 = new StockAchat();
                                        $stock_achat2->setQuantite($difference);
                                        $stock_achat2->setIsNoir(true);
                                        if ($stock_achat != null)
                                            $stock_achat2->setPrixAchatTtc($stock_achat->getPrixAchatTtc());
                                        else
                                            $stock_achat2->setPrixAchatTtc($article->getPrixAchatTtc());
                                        $stock_achat2->setStock($stock);
                                        $em->persist($stock_achat2);
                                        $difference = 0;
                                    }
                                } while ($difference > 0);
                            } else {
                                if ($ligne_article['quantite_blanc'] == 0)
                                    $em->remove($ligne_bl);
                            }
                        } else {
                            $quantite = $ligne_article['quantite'];
                            $stock->setQuantiteBlanc($stock->getQuantiteBlanc() - $quantite);
                            $stock->setQuantiteNoir($stock->getQuantiteNoir() + $quantite);
                            $prix_achat = 0;
                            do {
                                $stock_achat = $em->getRepository('GdsAchatBundle:StockAchat')->findOneBy(array('stock' => $stock, 'is_noir' => 0), array('prix_achat_ttc' => 'ASC'));
                                if ($stock_achat != null) {
                                    if ($stock_achat->getQuantite() <= $quantite) {
                                        $stock_achat->setIsNoir(true);
                                        $quantite -= $stock_achat->getQuantite();
                                        $prix_achat += ($stock_achat->getQuantite() * $stock_achat->getPrixAchatTtc());
                                    } else {
                                        $stock_achat->setQuantite($stock_achat->getQuantite() - $quantite);
                                        $stock_achat2 = new StockAchat ();
                                        $stock_achat2->setQuantite($quantite);
                                        $stock_achat2->setIsNoir(true);

                                        $stock_achat2->setPrixAchatTtc($stock_achat->getPrixAchatTtc());
                                        $prix_achat += ($quantite * $article->getPrixAchatTtc());

                                        $stock_achat2->setStock($stock);
                                        $em->persist($stock_achat2);
                                        $quantite = 0;
                                    }
                                } else {

                                    $stock_achat2 = new StockAchat ();
                                    $stock_achat2->setQuantite($quantite);
                                    $stock_achat2->setIsNoir(true);

                                    $stock_achat2->setPrixAchatTtc($article->getPrixAchatTtc());

                                    $stock_achat2->setStock($stock);
                                    $em->persist($stock_achat2);
                                    $quantite = 0;
                                }
                            } while ($quantite > 0);
                            $prix_achat /= $ligne_article['quantite'];
                            if ($ligne_bl == null) {
                                $ligne_bl2 = new LigneBonLivraisonClient();
                                $ligne_bl2->setArticle($article);
                                $ligne_bl2->setPrixAchatTtc($prix_achat);
                                $ligne_bl2->setPrixUnitaireHt($ligne_article['prix_vente']);
                                $ligne_bl2->setQuantiteBlanc($ligne_article['quantite']);
                                $ligne_bl2->setQuantiteNoir(0);
                                $ligne_bl2->setTauxRemise($ligne_article['remise']);
                                $ligne_bl2->setTauxTva($ligne_article['taux_tva']);
                                $bon_livraison->addLignesBonLivraison($ligne_bl2);
                                $em->persist($ligne_bl2);
                            } else {
                                $ligne_bl->setQuantiteBlanc($ligne_bl->getQuantiteBlanc() + $ligne_article['quantite']);
                                $ligne_bl->setQuantiteNoir(0);
                            }
                        }
                    }
                    $montant_bl_ttc = 0;
                    $history_bon_livraison = new HistoryBonLivraisonClient();
                    foreach ($bon_livraison->getLignesBonLivraison() as $ligne) {
                        if ($ligne->getQuantiteBlanc() > 0) {
                            $prix_vente = $ligne->getPrixUnitaireHt();
                            $taux_tva = $ligne->getTauxTva();
                            $remise = $ligne->getTauxRemise();
                            $prix_vente_ttc = $prix_vente * (1 + $taux_tva / 100) * (1 - $remise / 100);
                            $prix_vente_ttc = round($prix_vente_ttc, 3);
                            $quantite = $ligne->getQuantiteBlanc();
                            $montant = $quantite * $prix_vente_ttc;
                            $montant_bl_ttc+= $montant;
                            $history_ligne = new HistoryLigneBonLivraisonClient();
                            $history_ligne->setArticle($ligne->getArticle());
                            $history_ligne->setQuantiteBlanc($ligne->getQuantiteBlanc());
                            $history_ligne->setQuantiteNoir(0);
                            $history_ligne->setPrixUnitaireHt($ligne->getPrixUnitaireHt());
                            $history_ligne->setPrixAchatTtc($ligne->getPrixAchatTtc());
                            $history_ligne->setTauxRemise($ligne->getTauxRemise());
                            $history_ligne->setTauxTva($ligne->getTauxTva());
                            $history_bon_livraison->addHistoryLignesBonLivraison($history_ligne);
                            $em->persist($history_ligne);
                        }
                    }
                    if ($client->getRaisonSocial() != 'PASSAGER') {
                        $categorie_remise = $em->getRepository('GdsVenteBundle:CategorieRemise')->findOneBy(array('client' => $client, 'article' => $article));
                        if ($categorie_remise != null)
                            $categorie_remise->setRemise($ligne_article['remise']);
                        else {
                            $categorie_remise = new CategorieRemise();
                            $categorie_remise->setArticle($article);
                            $categorie_remise->setClient($client);
                            $categorie_remise->setRemise($ligne_article['remise']);
                            $em->persist($categorie_remise);
                        }
                    }

                    $societe->setNumeroFacture($societe->getNumeroFacture() + 1);
                    $bon_livraison->setMontantBlancTtc($montant_bl_ttc);
                    if ($ancien_montant_ttc > $bon_livraison->getMontantBlancTtc())
                        $bon_livraison->setReste($bon_livraison->getReste() - ($ancien_montant_ttc - $bon_livraison->getMontantBlancTtc()));
                    $client->setSolde($client->getSolde() - $ancien_montant_ttc + $bon_livraison->getMontantBlancTtc() + $timbre);
                    $bon_livraison->setMontantNoirTtc(0);
                    $bon_livraison->setUser($user);
                    $facture = new FactureClient();
                    $facture->setDate($this->stringToDate($date));
                    $facture->setHeure($heure);
                    $facture->setUser($user);
                    $facture->setMontantTtc($montant_bl_ttc + $timbre);
                    $facture->setReference($reference_facture);
                    $facture->setReste($bon_livraison->getReste() + $timbre);
                    $em->persist($facture);
                    $bon_livraison->setFacture($facture);
                    $history_bon_livraison->setReference($bon_livraison->getReference());
                    $history_bon_livraison->setDepartement($bon_livraison->getDepartement());
                    $history_bon_livraison->setReste($bon_livraison->getReste());
                    $history_bon_livraison->setMontantBlancTtc($bon_livraison->getMontantBlancTtc());
                    $history_bon_livraison->setMontantNoirTtc($bon_livraison->getMontantNoirTtc());
                    $history_bon_livraison->setUser($user);
                    $history_bon_livraison->setDate($this->DateTimeNow()[0]);
                    $history_bon_livraison->setHeure($this->DateTimeNow()[1]);
                    $history_bon_livraison->setClient($bon_livraison->getClient());
                    $history_bon_livraison->setIsFacturer(true);
                    $em->persist($history_bon_livraison);
                    $em->flush();
                    $response = new Response(json_encode(array('success' => true, 'id' => $facture->getId())));
                    $response->headers->set('Content-Type', 'application/json');
                    return $response;
                }
                else {
                    $societe->setNumeroFacture($societe->getNumeroFacture() + 1);
                    $facture = new FactureClient();
                    $facture->setDate($this->stringToDate($date));
                    $facture->setHeure($heure);
                    $facture->setUser($user);
                    $facture->setMontantTtc($bon_livraison->getMontantTtc() + $timbre);
                    $client->setSolde($client->getSolde() + $timbre);
                    $facture->setReference($reference_facture);
                    $facture->setReste($bon_livraison->getReste() + $timbre);
                    $em->persist($facture);
                    $bon_livraison->setFacture($facture);
                    $history_bon_livraison = new HistoryBonLivraisonClient();
                    foreach ($bon_livraison->getLignesBonLivraison() as $ligne) {
                        $history_ligne = new HistoryLigneBonLivraisonClient();
                        $history_ligne->setArticle($ligne->getArticle());
                        $history_ligne->setQuantiteBlanc($ligne->getQuantiteBlanc());
                        $history_ligne->setQuantiteNoir(0);
                        $history_ligne->setPrixUnitaireHt($ligne->getPrixUnitaireHt());
                        $history_ligne->setPrixAchatTtc($ligne->getPrixAchatTtc());
                        $history_ligne->setTauxRemise($ligne->getTauxRemise());
                        $history_ligne->setTauxTva($ligne->getTauxTva());
                        $history_bon_livraison->addHistoryLignesBonLivraison($history_ligne);
                        $em->persist($history_ligne);
                    }
                    $history_bon_livraison->setReference($bon_livraison->getReference());
                    $history_bon_livraison->setDepartement($bon_livraison->getDepartement());
                    $history_bon_livraison->setReste($bon_livraison->getReste());
                    $history_bon_livraison->setMontantBlancTtc($bon_livraison->getMontantBlancTtc());
                    $history_bon_livraison->setMontantNoirTtc($bon_livraison->getMontantNoirTtc());
                    $history_bon_livraison->setUser($user);
                    $history_bon_livraison->setDate($this->DateTimeNow()[0]);
                    $history_bon_livraison->setHeure($this->DateTimeNow()[1]);
                    $history_bon_livraison->setClient($bon_livraison->getClient());
                    $history_bon_livraison->setIsCloturer(true);
                    $history_bon_livraison->setIsFacturer(true);
                    $em->persist($history_bon_livraison);
                    $em->flush();
                    $response = new Response(json_encode(array('success' => true, 'id' => $facture->getId())));
                    $response->headers->set('Content-Type', 'application/json');
                    return $response;
                }
            } catch (Exception $e) {
                $response = new Response(json_encode(array('success' => false)));
                $response->headers->set('Content-Type', 'application/json');
                return $response;
            }
        }
        $lignes = array();
        foreach ($bon_livraison->getLignesBonLivraison() as $k => $ligne) {
            $lignes[$k] = $ligne;
        }
        if ($this->hasBlack($em, $bon_livraison))
            return $this->render('GdsVenteBundle:BonLivraison:bon_livraison_to_facture2.html.twig', array('lignes' => $lignes, 'id' => $id, 'timbre' => $timbre, 'bonlivraison' => $bon_livraison, 'reference' => $reference_facture));
        return $this->render('GdsVenteBundle:BonLivraison:bon_livraison_to_facture1.html.twig', array('lignes' => $lignes, 'id' => $id, 'timbre' => $timbre, 'bonlivraison' => $bon_livraison, 'reference' => $reference_facture));
    }

    public function facturerPlusieursAction() {
        $em = $this->getDoctrine()->getEntityManager();
        $request = $this->getRequest();
        $ids_requested = $request->get('ids');
        $ids = json_decode($ids_requested);
        sort($ids);
        $societe = $em->getRepository('GdsArticleBundle:Societe')->findAll()[0];
        $reference_facture = $societe->getPrefixeFacture() . ' ' . $societe->getNumeroFacture();
        $timbre = $societe->getTimbreFiscal();
        $user = $this->getUser();
        $index = $request->get('index');
        if (!$index) {
            $index = 0;
        }
        $id = $ids[$index];
        $bon_livraison = $em->getRepository('GdsVenteBundle:BonLivraisonClient')->find($id);
        if ($request->isMethod('POST')) {
            $index++;
            try {
                $date = $request->get('date');
                $heure = $request->get('heure');
                $all_articles = json_decode($request->get('all_articles'));
                $ancien_montant_ttc = $bon_livraison->getMontantTtc();
                $client = $bon_livraison->getClient();
                if ($this->hasBlack($em, $bon_livraison)) {
                    $departement = $bon_livraison->getDepartement();
                    $lignes = $this->fusionner_json($all_articles);
                    foreach ($lignes as $ligne_article) {
                        $article = $em->getRepository('GdsArticleBundle:Article')->find($ligne_article['id']);
                        $stock = $em->getRepository('GdsArticleBundle:Stock')->findOneBy(array('article' => $article, 'departement' => $departement));
                        $ligne_bl = $em->getRepository('GdsVenteBundle:LigneBonLivraisonClient')->findOneBy(array('bon_livraison' => $bon_livraison, 'article' => $article));
                        if (!$ligne_article['replaced']) {
                            if ($ligne_article['changed']) {
                                $ligne_bl->setQuantiteBlanc($ligne_article['quantite_blanc']);
                                $ligne_bl->setQuantiteNoir(0);
                                $difference = $ligne_article['quantite_blanc'] - $ligne_article['quantite_blanc_begin'];
                                $stock->setQuantiteBlanc($stock->getQuantiteBlanc() - $difference);
                                $stock->setQuantiteNoir($stock->getQuantiteNoir() + $difference);
                                do {
                                    $stock_achat = $em->getRepository('GdsAchatBundle:StockAchat')->findBy(array('stock' => $stock, 'is_noir' => 0), array('prix_achat_ttc' => 'ASC'));
                                    if ($stock_achat != null && $stock_achat->getQuantite() <= $difference) {
                                        $stock_achat->setIsNoir(true);
                                        $difference -= $stock_achat->getQuantite();
                                    } else {
                                        if ($stock_achat != null)
                                            $stock_achat->setQuantite($stock_achat->getQuantite() - $difference);
                                        $stock_achat2 = new StockAchat();
                                        $stock_achat2->setQuantite($difference);
                                        $stock_achat2->setIsNoir(true);
                                        if ($stock_achat != null)
                                            $stock_achat2->setPrixAchatTtc($stock_achat->getPrixAchatTtc());
                                        else
                                            $stock_achat2->setPrixAchatTtc($article->getPrixAchatTtc());
                                        $stock_achat2->setStock($stock);
                                        $em->persist($stock_achat2);
                                        $difference = 0;
                                    }
                                } while ($difference > 0);
                            } else {
                                if ($ligne_article['quantite_blanc'] == 0)
                                    $em->remove($ligne_bl);
                            }
                        } else {
                            $quantite = $ligne_article['quantite'];
                            $stock->setQuantiteBlanc($stock->getQuantiteBlanc() - $quantite);
                            $stock->setQuantiteNoir($stock->getQuantiteNoir() + $quantite);
                            $prix_achat = 0;
                            do {
                                $stock_achat = $em->getRepository('GdsAchatBundle:StockAchat')->findOneBy(array('stock' => $stock, 'is_noir' => 0), array('prix_achat_ttc' => 'ASC'));
                                if ($stock_achat != null) {
                                    if ($stock_achat->getQuantite() <= $quantite) {
                                        $stock_achat->setIsNoir(true);
                                        $quantite -= $stock_achat->getQuantite();
                                        $prix_achat += ($stock_achat->getQuantite() * $stock_achat->getPrixAchatTtc());
                                    } else {
                                        $stock_achat->setQuantite($stock_achat->getQuantite() - $quantite);
                                        $stock_achat2 = new StockAchat ();
                                        $stock_achat2->setQuantite($quantite);
                                        $stock_achat2->setIsNoir(true);

                                        $stock_achat2->setPrixAchatTtc($stock_achat->getPrixAchatTtc());
                                        $prix_achat += ($quantite * $article->getPrixAchatTtc());

                                        $stock_achat2->setStock($stock);
                                        $em->persist($stock_achat2);
                                        $quantite = 0;
                                    }
                                } else {

                                    $stock_achat2 = new StockAchat ();
                                    $stock_achat2->setQuantite($quantite);
                                    $stock_achat2->setIsNoir(true);

                                    $stock_achat2->setPrixAchatTtc($article->getPrixAchatTtc());

                                    $stock_achat2->setStock($stock);
                                    $em->persist($stock_achat2);
                                    $quantite = 0;
                                }
                            } while ($quantite > 0);
                            $prix_achat /= $ligne_article['quantite'];
                            if ($ligne_bl == null) {
                                $ligne_bl2 = new LigneBonLivraisonClient();
                                $ligne_bl2->setArticle($article);
                                $ligne_bl2->setPrixAchatTtc($prix_achat);
                                $ligne_bl2->setPrixUnitaireHt($ligne_article['prix_vente']);
                                $ligne_bl2->setQuantiteBlanc($ligne_article['quantite']);
                                $ligne_bl2->setQuantiteNoir(0);
                                $ligne_bl2->setTauxRemise($ligne_article['remise']);
                                $ligne_bl2->setTauxTva($ligne_article['taux_tva']);
                                $bon_livraison->addLignesBonLivraison($ligne_bl2);
                                $em->persist($ligne_bl2);
                            } else {
                                $ligne_bl->setQuantiteBlanc($ligne_bl->getQuantiteBlanc() + $ligne_article['quantite']);
                                $ligne_bl->setQuantiteNoir(0);
                            }
                        }
                    }
                    $montant_bl_ttc = 0;
                    $history_bon_livraison = new HistoryBonLivraisonClient();
                    foreach ($bon_livraison->getLignesBonLivraison() as $ligne) {
                        if ($ligne->getQuantiteBlanc() > 0) {
                            $prix_vente = $ligne->getPrixUnitaireHt();
                            $taux_tva = $ligne->getTauxTva();
                            $remise = $ligne->getTauxRemise();
                            $prix_vente_ttc = $prix_vente * (1 + $taux_tva / 100) * (1 - $remise / 100);
                            $prix_vente_ttc = round($prix_vente_ttc, 3);
                            $quantite = $ligne->getQuantiteBlanc();
                            $montant = $quantite * $prix_vente_ttc;
                            $montant_bl_ttc+= $montant;
                            $history_ligne = new HistoryLigneBonLivraisonClient();
                            $history_ligne->setArticle($ligne->getArticle());
                            $history_ligne->setQuantiteBlanc($ligne->getQuantiteBlanc());
                            $history_ligne->setQuantiteNoir(0);
                            $history_ligne->setPrixUnitaireHt($ligne->getPrixUnitaireHt());
                            $history_ligne->setPrixAchatTtc($ligne->getPrixAchatTtc());
                            $history_ligne->setTauxRemise($ligne->getTauxRemise());
                            $history_ligne->setTauxTva($ligne->getTauxTva());
                            $history_bon_livraison->addHistoryLignesBonLivraison($history_ligne);
                            $em->persist($history_ligne);
                        }
                    }
                    if ($client->getRaisonSocial() != 'PASSAGER') {
                        $categorie_remise = $em->getRepository('GdsVenteBundle:CategorieRemise')->findOneBy(array('client' => $client, 'article' => $article));
                        if ($categorie_remise != null)
                            $categorie_remise->setRemise($ligne_article['remise']);
                        else {
                            $categorie_remise = new CategorieRemise();
                            $categorie_remise->setArticle($article);
                            $categorie_remise->setClient($client);
                            $categorie_remise->setRemise($ligne_article['remise']);
                            $em->persist($categorie_remise);
                        }
                    }
                    $bon_livraison->setMontantBlancTtc($montant_bl_ttc);
                    if ($ancien_montant_ttc > $bon_livraison->getMontantBlancTtc())
                        $bon_livraison->setReste($bon_livraison->getReste() - ($ancien_montant_ttc - $bon_livraison->getMontantBlancTtc()));
                    $client->setSolde($client->getSolde() - $ancien_montant_ttc + $bon_livraison->getMontantBlancTtc());
                    $bon_livraison->setMontantNoirTtc(0);
                    $bon_livraison->setUser($user);
                    $history_bon_livraison->setReference($bon_livraison->getReference());
                    $history_bon_livraison->setDepartement($bon_livraison->getDepartement());
                    $history_bon_livraison->setReste($bon_livraison->getReste());
                    $history_bon_livraison->setMontantBlancTtc($bon_livraison->getMontantBlancTtc());
                    $history_bon_livraison->setMontantNoirTtc($bon_livraison->getMontantNoirTtc());
                    $history_bon_livraison->setUser($user);
                    $history_bon_livraison->setDate($this->DateTimeNow()[0]);
                    $history_bon_livraison->setHeure($this->DateTimeNow()[1]);
                    $history_bon_livraison->setClient($bon_livraison->getClient());
                    $history_bon_livraison->setIsFacturer(true);
                    $em->persist($history_bon_livraison);
                    $em->flush();
                }
                if ($index == count($ids)) {
                    $montant_ttc = 0;
                    $reste = 0;
                    $societe->setNumeroFacture($societe->getNumeroFacture() + 1);
                    $facture = new FactureClient();
                    $facture->setDate($this->stringToDate($date));
                    $facture->setHeure($heure);
                    $facture->setUser($user);
                    $facture->setReference($reference_facture);
                    foreach ($ids as $id) {
                        $bon_livraison = $em->getRepository('GdsVenteBundle:BonLivraisonClient')->find($id);
                        $montant_ttc+= $bon_livraison->getMontantTtc();
                        $reste+= $bon_livraison->getReste();
                        $bon_livraison->setFacture($facture);
                    }
                    $client->setSolde($client->getSolde() + $timbre);
                    $facture->setMontantTtc($montant_ttc + $timbre);
                    $facture->setReste($reste + $timbre);
                    $em->persist($facture);
                    $em->flush();
                    $response = new Response(json_encode(array('success' => true, 'id' => $facture->getId())));
                    $response->headers->set('Content-Type', 'application/json');
                    return $response;
                } else {
                    $id = $ids[$index];
                    $bon_livraison = $em->getRepository('GdsVenteBundle:BonLivraisonClient')->find($id);
                    $lignes = array();
                    foreach ($bon_livraison->getLignesBonLivraison() as $k => $ligne) {
                        $lignes[$k] = $ligne;
                    }
                    if ($this->hasBlack($em, $bon_livraison))
                        return $this->render('GdsVenteBundle:BonLivraison:bons_livraison_to_facture2.html.twig', array('lignes' => $lignes, 'index' => $index, 'count' => count($ids), 'ids' => $ids_requested, 'timbre' => $timbre, 'bonlivraison' => $bon_livraison, 'id' => $bon_livraison->getId(), 'reference' => $reference_facture));
                    else
                        return $this->render('GdsVenteBundle:BonLivraison:bons_livraison_to_facture1.html.twig', array('lignes' => $lignes, 'index' => $index, 'count' => count($ids), 'ids' => $ids_requested, 'timbre' => $timbre, 'bonlivraison' => $bon_livraison, 'id' => $bon_livraison->getId(), 'reference' => $reference_facture));
                }
            } catch (Exception $e) {
                $response = new Response(json_encode(array('success' => false)));
                $response->headers->set('Content-Type', 'application/json');
                return $response;
            }
        }

        $lignes = array();
        foreach ($bon_livraison->getLignesBonLivraison() as $k => $ligne) {
            $lignes[$k] = $ligne;
        }
        if ($this->hasBlack($em, $bon_livraison))
            return $this->render('GdsVenteBundle:BonLivraison:bons_livraison_to_facture2.html.twig', array('lignes' => $lignes, 'index' => 0, 'count' => count($ids), 'ids' => $ids_requested, 'timbre' => $timbre, 'bonlivraison' => $bon_livraison, 'id' => $bon_livraison->getId(), 'reference' => $reference_facture));
        else
            return $this->render('GdsVenteBundle:BonLivraison:bons_livraison_to_facture1.html.twig', array('lignes' => $lignes, 'index' => 0, 'count' => count($ids), 'ids' => $ids_requested, 'timbre' => $timbre, 'bonlivraison' => $bon_livraison, 'id' => $bon_livraison->getId(), 'reference' => $reference_facture));
    }

    function hasBlack($em, $bon_livraison) {
        $lignes = $em->getRepository('GdsVenteBundle:LigneBonLivraisonClient')->findBy(array('bon_livraison' => $bon_livraison));
        foreach ($lignes as $ligne) {
            if ($ligne->getQuantiteNoir() > 0)
                return true;
        }
        return false;
    }

    function getLigne($bon_livraison, $article) {
        foreach ($bon_livraison->getLignesBonLivraison() as $ligne) {
            if ($ligne->getArticle() == $article)
                return $ligne;
        }
        return null;
    }

    function fusionner_json($all_articles) {
        $lignes = array();
        $articles = $all_articles->articles;
        $articles_replaced = $all_articles->articles_replaced;
        $cmp = 0;
        foreach ($articles as $article) {
            $lignes[$cmp]['id'] = $article->id;
            $lignes[$cmp]['quantite_blanc_begin'] = floatval($article->quantite_blanc_begin);
            $lignes[$cmp]['quantite_noir_begin'] = floatval($article->quantite_noir_begin);
            $lignes[$cmp]['quantite_blanc'] = floatval($article->quantite_blanc);
            $lignes[$cmp]['quantite_noir'] = floatval($article->quantite_noir);
            $lignes[$cmp]['prix_vente'] = $article->prix_vente;
            $lignes[$cmp]['taux_tva'] = $article->taux_tva;
            $lignes[$cmp]['remise'] = $article->remise;
            $lignes[$cmp]['replaced'] = false;
            if (floatval($article->quantite_blanc_begin) != floatval($article->quantite_blanc))
                $lignes[$cmp]['changed'] = true;
            else
                $lignes[$cmp]['changed'] = false;
            $cmp++;
        }
        foreach ($articles_replaced as $article) {
            if (floatval($article->quantite) > 0) {
                $lignes[$cmp]['id'] = $article->id;
                $lignes[$cmp]['quantite'] = floatval($article->quantite);
                $lignes[$cmp]['prix_vente'] = $article->prix_vente;
                $lignes[$cmp]['taux_tva'] = $article->taux_tva;
                $lignes[$cmp]['remise'] = $article->remise;
                $lignes[$cmp]['replaced'] = true;
                $cmp++;
            }
        }
        return $lignes;
    }

    function stringToDate($date) {
        list($day, $month, $year) = split('/', $date);
        $date = $year . '-' . $month . '-' . $day;
        return new \DateTime($date);
    }

    public function historiqueAction() {
        $em = $this->getDoctrine()->getEntityManager();
        $request = $this->getRequest();
        $id = $request->get('id');
        $bon_livraison = $em->getRepository('GdsVenteBundle:BonLivraisonClient')->find($id);
        $reference_bon_livraison = $bon_livraison->getReference();
        $histories = $em->getRepository('GdsVenteBundle:HistoryBonLivraisonClient')->findByReference($reference_bon_livraison);
        return $this->render('GdsVenteBundle:BonLivraison:historiques.html.twig', array('histories' => $histories, 'reference' => $reference_bon_livraison));
    }

    public function historiqueShowAction() {
        $em = $this->getDoctrine()->getEntityManager();
        $request = $this->getRequest();
        $id = $request->get('id');
        $historique_bon_livraison = $em->getRepository('GdsVenteBundle:HistoryBonLivraisonClient')->find($id);
        $historique_lignes_bon_livraison = $em->getRepository('GdsVenteBundle:HistoryLigneBonLivraisonClient')->findBy(array('history_bon_livraison' => $historique_bon_livraison));
        $lignes = $em->getRepository('GdsVenteBundle:HistoryLigneBonLivraisonClient')->findBy(array('history_bon_livraison' => $historique_bon_livraison), array('taux_tva' => 'ASC'));
        $taxes = array();
        foreach ($lignes as $ligne) {
            $tva = $ligne->getTauxTva();
            $base = $ligne->getQuantite() * $ligne->getPrixUnitaireHt() * (1 - $ligne->getTauxRemise() / 100);
            $montant = $base * $tva / 100;
            $exist = false;
            foreach ($taxes as $k => $taxe) {
                if (!$exist && $taxe['tva'] == $tva) {
                    $taxes[$k]['base']+=$base;
                    $taxes[$k]['montant']+=$montant;
                    $exist = true;
                }
            }
            if (!$exist) {
                $taxe = array();
                $taxe['tva'] = $tva;
                $taxe['base'] = $base;
                $taxe['montant'] = $montant;
                $taxes[count($taxes)] = $taxe;
            }
        }
        return $this->render('GdsVenteBundle:BonLivraison:bon_livraison_historique_show.html.twig', array('bon_livraison' => $historique_bon_livraison, 'lignes' => $historique_lignes_bon_livraison, 'taxes' => $taxes));
    }

    function DateTimeNow() {
        $date = date("Y-m-d H:i:s", time());
        list($a, $b) = split('[ ]', $date);
        list($h, $m, $s) = split('[:]', $b);
        $time = $h * 3600 + $m * 60 + $s;
        $date = new \DateTime('NOW');
        return (array($date, $time));
    }

    function int2str($a) {
        if ($a < 0)
            return 'moins ' . $this->int2str(-$a);
        if ($a < 17) {
            switch ($a) {
                case 0: return 'zero';
                case 1: return 'un';
                case 2: return 'deux';
                case 3: return 'trois';
                case 4: return 'quatre';
                case 5: return 'cinq';
                case 6: return 'six';
                case 7: return 'sept';
                case 8: return 'huit';
                case 9: return 'neuf';
                case 10: return 'dix';
                case 11: return 'onze';
                case 12: return 'douze';
                case 13: return 'treize';
                case 14: return 'quatorze';
                case 15: return 'quinze';
                case 16: return 'seize';
            }
        } else if ($a < 20) {
            return 'dix-' . $this->int2str($a - 10);
        } else if ($a < 100) {
            if ($a % 10 == 0) {
                switch ($a) {
                    case 20: return 'vingt';
                    case 30: return 'trente';
                    case 40: return 'quarante';
                    case 50: return 'cinquante';
                    case 60: return 'soixante';
                    case 70: return 'soixante-dix';
                    case 80: return 'quatre-vingt';
                    case 90: return 'quatre-vingt-dix';
                }
            } else if ($a < 70) {
                return $this->int2str($a - $a % 10) . ' ' . $this->int2str($a % 10);
            } else if ($a < 80) {
                return $this->int2str(60) . ' ' . $this->int2str($a % 20);
            } else {
                return $this->int2str(80) . ' ' . $this->int2str($a % 20);
            }
        } else if ($a == 100) {
            return 'cent';
        } else if ($a < 200) {
            return $this->int2str(100) . ' ' . $this->int2str($a % 100);
        } else if ($a < 1000) {
            if (($a % 100) > 0)
                return $this->int2str((int) ($a / 100)) . ' ' . $this->int2str(100) . ' ' . $this->int2str($a % 100);
            else
                return $this->int2str((int) ($a / 100)) . ' ' . $this->int2str(100);
        } else if ($a == 1000) {
            return 'mille';
        } else if ($a < 2000) {
            return $this->int2str(1000) . ' ' . $this->int2str($a % 1000) . ' ';
        } else if ($a < 1000000) {
            return $this->int2str((int) ($a / 1000)) . ' ' . $this->int2str(1000) . ' ' . $this->int2str($a % 1000);
        }
    }

    function chiffre_to_lettre($a) {
        $total = explode(".", $a);
        $dinars = $total[0];
        $millimes = 0;
        if (count($total) == 2) {
            $millimes = $total[1];
            $a = number_format($a, 3);
            $index_point = strpos($a, '.');
            $i = $index_point + 1;
            if ($a[$i] != 0) {
                if ($a[$i + 1] != 0) {
                    if ($a[$i + 2] != 0) {
                        //rien
                    } else {
                        $millimes*=10;
                    }
                } else {
                    if ($a[$i + 2] != 0) {
                        //rien
                    } else {
                        $millimes*=100;
                    }
                }
            } else {
                if ($a[$i + 1] != 0) {
                    if ($a[$i + 2] != 0) {
                        //rien
                    } else {
                        $millimes*=10;
                    }
                } else {
                    if ($a[$i + 2] != 0) {
                        //rien
                    } else {
                        //rien
                    }
                }
            }
        }
        $lettre = $this->int2str($dinars) . " dinars et " . $this->int2str($millimes) . " millimes";
        return $lettre;
    }

}
